package com.wzy.newcollection;

import java.util.LinkedList;
import java.util.List;
import java.util.Set;

import org.junit.Test;

import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;

/**
 * Guava 提供了大量的集合工具类，比如Lists，Sets，Maps
 */
public class CollectionUtils
{
	public static final Set<Integer> gSetOne = Sets.newHashSet(1, 2, 3);
	public static final Set<Integer> gSetTwo = Sets.newHashSet(3, 4, 5, 6);

	public static final List<Integer> list = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7);

	/**
	 * 常用方式
	 * 反转、拆分
	 *
	 * @throws Exception
	 */
	@Test
	public void testLists() throws Exception
	{
		// 拆分
		List<List<Integer>> partition = Lists.partition(list, 3);
		System.out.println("拆分为3个一组 = " + partition);

		// 反转列表
		LinkedList<Integer> testList = Lists.newLinkedList();
		testList.add(1);
		testList.add(2);
		testList.add(3);
		List<Integer> reverseList = Lists.reverse(testList);
		System.out.println("testList 反转 = " + reverseList);

	}

	/**
	 * 常用方式
	 * 并集、交集、差集、分解集合中的所有子集、求两个集合的笛卡尔积
	 *
	 * @throws Exception
	 */
	@Test
	public void testSets() throws Exception
	{
		// 求并集
		Set<Integer> union = Sets.union(gSetOne, gSetTwo);
		// 并集 = [1, 2, 3, 4, 5, 6]
		System.out.println("并集 = " + union);

		// 求交集
		Set<Integer> intersection = Sets.intersection(gSetOne, gSetTwo);
		System.out.println("交集 = " + intersection);

		// 求差集 (只存在于第一个集合并且不存在与第二个集合的元素)
		Set<Integer> set = Sets.difference(gSetOne, gSetTwo);
		System.out.println("gSetOne差集 = " + set);

		// 相对差集 ： 属于A而不属于B 或者 属于B而不属于A
		Set<Integer> symmetricDifference = Sets.symmetricDifference(gSetOne, gSetTwo);
		System.out.println("相对差集 = " + symmetricDifference);

		// 拆解所有子集
		Set<Set<Integer>> sets = Sets.powerSet(gSetOne);
		System.out.println("gSetOne所有子集 = " + JSON.toJSON(sets));

		// 返回笛卡尔积
		Set<List<Integer>> cartesianProduct = Sets.cartesianProduct(gSetOne, gSetTwo);
		System.out.println("笛卡尔积 = " + cartesianProduct);
	}

}
